// 导入数据库操作模块:
const db = require('../db/index');

// 导入处理路径的 path 核心模块
const path = require('path')

// 导入需要的验证规则对象
const { validateAddArticle } = require('../schema/article');


/**************** 发布新文章 *****************/
// 发布新文章的处理函数
exports.addArticle = async (req, res, next) => {
    // 手动判断是否上传了文章封面
    if (!req.file || req.file.fieldname !== 'cover_img') return res.cc('文章封面是必选参数！');

    // 1.接受表单提交的数据
    const article = req.body;
    console.log(article);
    // 2.判断数据是否合法 用joi第三方模块判断
    try {
        await validateAddArticle(article);
    } catch (err) {
        // 异步方法只能用 next() 方法触发错误处理中间件 next()只能传递字符串
        return next(err.message);
    }

    // 1.整理要插入数据库的文章信息对象：
    const articleInfo = {
        // 标题、内容、状态、所属的分类Id
        ...article,
        // 文章封面在服务器端的存放路径
        cover_img: path.join('/uploads', req.file.filename),
        // 文章发布时间
        pub_date: new Date(),
        // 文章作者的Id
        author_id: req.user.id,
    }
    // 2.定义发布文章的 SQL 语句：
    const sql = 'insert into ev_articles set ?';
    // 3.调用 db.query() 执行发布文章的 SQL 语句：
    // 执行 SQL 语句
    db.query(sql, articleInfo, (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.cc(err)

        // 执行 SQL 语句成功，但是影响行数不等于 1
        if (results.affectedRows !== 1) return res.cc('发布文章失败！')

        // 发布文章成功
        res.cc('发布文章成功', 0)
    })
}
/************* 获取文章的列表数据 *************/
// 获取文章的列表数据的处理函数
exports.getArticleList = async (req, res) => {
    // 接受 GET 请求的参数的数据 req.query 将数据转化为字符串
    const artInfo = req.query;
    const data = filterSQL(artInfo);
    // 调用 db.query() 执行 SQL 语句：
    db.query(data.sql, data.params, (err, results) => {
        // 1. 执行 SQL 语句失败
        if (err) return res.cc(err);

        // 2. 执行 SQL 语句成功
        res.send({
            status: 0,
            message: '获取文章列表数据成功！',
            data: results,
            total: 5
        });
    });
}

// 定义 SQL 语句：
function filterSQL(artInfo) {
    // 根据参数查询数据 分页查询 
    // limit分页公式：curPage是当前第几页；pageSize是一页多少条记录
    // select * from student limit(curPage - 1) * pageSize, pageSize;
    const param = (artInfo.curPage - 1) * artInfo.pageSize;
    var data = {};
    // cate_id 和 state 不为空
    if (artInfo.cate_id && artInfo.state) {
        data.sql = 'select ev_articles.id,title,pub_date,state,name as cate_name from ev_articles,ev_article_cate where (ev_articles.cate_id = ev_article_cate.id and ev_articles.cate_id = ? and ev_articles.state =?) limit ?,?';
        data.params = [parseInt(artInfo.cate_id), artInfo.state, param, parseInt(artInfo.pageSize)];
    }
    // cate_id 不为空 且 state 为空
    else if (artInfo.cate_id && !artInfo.state) {
        data.sql = 'select ev_articles.id,title,pub_date,state,name as cate_name from ev_articles,ev_article_cate where (ev_articles.cate_id = ev_article_cate.id and ev_articles.cate_id = ?) limit ?,?';
        data.params = [parseInt(artInfo.cate_id), param, parseInt(artInfo.pageSize)];
    }
    // cate_id 为空 且 state 不为空
    else if (!artInfo.cate_id && artInfo.state) {
        data.sql = 'select ev_articles.id,title,pub_date,state,name as cate_name from ev_articles,ev_article_cate where (ev_articles.cate_id = ev_article_cate.id and ev_articles.state = ?) limit ?,?';
        data.params = [artInfo.state, param, parseInt(artInfo.pageSize)];
    }
    // cate_id 和 state 为空
    else {
        data.sql = 'select ev_articles.id,title,pub_date,state,name as cate_name from ev_articles,ev_article_cate where (ev_articles.cate_id = ev_article_cate.id) limit ?,?';
        data.params = [param, parseInt(artInfo.pageSize)]
    }
    return data;
}


/************ 根据 Id 删除文章数据 ************/
/************ 根据 Id 获取文章详情 ************/
/************ 根据 Id 更新文章信息 ************/